package com.lqk.buffer;

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.nio.channels.FileChannel;

/**
 * 缓冲区的作用的是，用户缓冲区满的时候，才进行一次系统调用
 * Buffer在Java NIO 中负责数据的存取，缓冲区就是数组，用于存储不同数据类型的数据。
 *
 * Buffer 常用子类：
 *  ByteBuffer // 核心类，后面的类都是它的装饰类
 *  CharBuffer
 *  ShortBuffer
 *  IntBuffer
 *  LongBuffer
 *  FloatBuffer
 *  DoubleBuffer
 *  //没有BoolBuffer
 *
 *  MappedByteBuffer // 用于实现内存映射文件
 *
 *   //我们可以通过他们的静态方法获取对应的buffer
 *  static XxxBuffer allocate(int capacity)
 *
 */
public class BufferDemo1 {

    private static void byteBuffer() throws Exception {
        //创建FileChannel
        RandomAccessFile aFile=new RandomAccessFile("F:\\lqk\\01.txt","rw");
        FileChannel channel = aFile.getChannel();

        //创建buffer
        ByteBuffer buffer = ByteBuffer.allocate(1024);

        //读操作
        int bytesRead = channel.read(buffer);
        while (bytesRead != -1){
            //模式转换
            buffer.flip();
            while (buffer.hasRemaining()){
                System.out.println((char) buffer.get());
            }
            buffer.clear(); //clear方法是将Buffer中的数据全部清空
//            buffer.compact();//清除读过的数据，未读过的数据不会清除
            bytesRead = channel.read(buffer);
        }

        channel.close();
        aFile.close();

    }

    private static void intBuffer(){
        //创建IntBuffer
        IntBuffer intBuffer = IntBuffer.allocate(8);

        //往buffer中放数据
        for (int i = 0; i < intBuffer.capacity(); i++) {
            int j=2*(i+1);
            intBuffer.put(j);
        }
        //重置缓冲区
        intBuffer.flip();

        //获取buffer中的数据
        while (intBuffer.hasRemaining()){
            int value = intBuffer.get();
            System.out.println(value+" ");
        }
    }

    public static void main(String[] args) throws Exception {
//        BufferDemo1.byteBuffer();
        BufferDemo1.intBuffer();
    }

}
